package org.example.leetcode;

import java.util.HashSet;
import java.util.Set;

/**
 * @Description: TODO
 * @Author wyatt
 * @Data 2024/05/13 10:52
 */

//在给定的 m x n 网格
// grid 中，每个单元格可以有以下三个值之一：
//
//
// 值 0 代表空单元格；
// 值 1 代表新鲜橘子；
// 值 2 代表腐烂的橘子。
//
//
// 每分钟，腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。
//
// 返回 直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能，返回 -1 。
//
//
//
// 示例 1：
//
//
//
//
//输入：grid = [[2,1,1],[1,1,0],[0,1,1]]
//输出：4
//
//
// 示例 2：
//
//
//输入：grid = [[2,1,1],[0,1,1],[1,0,1]]
//输出：-1
//解释：左下角的橘子（第 2 行， 第 0 列）永远不会腐烂，因为腐烂只会发生在 4 个方向上。
//
//
// 示例 3：
//
//
//输入：grid = [[0,2]]
//输出：0
//解释：因为 0 分钟时已经没有新鲜橘子了，所以答案就是 0 。
//
//
//
//
// 提示：
//
//
// m == grid.length
// n == grid[i].length
// 1 <= m, n <= 10
// grid[i][j] 仅为 0、1 或 2
//
//
// Related Topics 广度优先搜索 数组 矩阵 👍 855 👎 0


public class Solution994 {

    public static void main(String[] args) {
        Solution994 solution994 = new Solution994();

        int[][] grid = new int[][]{{2,1,1},{0,1,1},{1,0,1}};

        System.out.println(solution994.orangesRotting(grid));

    }

    public int orangesRotting(int[][] grid) {
        int day = 0;
        int fresh = 0;
        int rotted = 0;


        for(int i=0;i<grid.length;i++){
            for(int j=0;j<grid[i].length;j++){
                if(grid[i][j] == 1){
                    fresh++;
                } else if (grid[i][j] == 2) {
                    rotted++;
                }
            }
        }

        if(fresh == 0 || rotted ==0){
            day = 0;
        }

        int dayRotted = 1;
        while (dayRotted > 0 && fresh > 0) {
            Set<String> rottedGridSign = calDayRotted(grid);
            dayRotted = rottedGridSign.size();

            //染色
            if(rottedGridSign.size() > 0){
                for(String key : rottedGridSign){
                    String[] keyArr = key.split("_");
                    if(keyArr.length == 2){
                        grid[Integer.valueOf(keyArr[0])][Integer.valueOf(keyArr[1])] = 2;
                    }
                }
            }

            if(dayRotted > 0){
                day++;
                fresh -= dayRotted;
            }
        }

        if(fresh > 0){
            day = -1;
        }

        return day;
    }

    private Set<String> calDayRotted(int[][] grid) {
        Set<String> rottedGridSign = new HashSet<>();
        //计算
        for(int i=0;i<grid.length;i++) {
            for (int j = 0; j < grid[i].length; j++) {
                if(grid[i][j] == 2){
                    if(i>0){
                        String key1 = "".concat(i-1+"").concat("_").concat(j+"");
                        if(grid[i-1][j] == 1 && !rottedGridSign.contains(key1)) {
                            rottedGridSign.add(key1);
                        }
                    }

                    if(j>0){
                        String key1 = "".concat(i+"").concat("_").concat(j-1+"");
                        if(grid[i][j-1] == 1 && !rottedGridSign.contains(key1)) {
                            rottedGridSign.add(key1);
                        }
                    }

                    if(i+1<grid.length){
                        String key1 = "".concat(i+1+"").concat("_").concat(j+"");
                        if(grid[i+1][j] == 1 && !rottedGridSign.contains(key1)) {
                            rottedGridSign.add(key1);
                        }
                    }

                    if(j+1<grid[i].length){
                        String key1 = "".concat(i+"").concat("_").concat(j+1+"");
                        if(grid[i][j+1] == 1 && !rottedGridSign.contains(key1)) {
                            rottedGridSign.add(key1);
                        }
                    }

                }
            }
        }

        return rottedGridSign;
    }

}
